#include "event_loop.h"

using namespace uvpp;

EventLoop::EventLoop()
	:EventLoop(LoopMode::New)
{

}

EventLoop::~EventLoop()
{
	if (_loop.get() != uv_default_loop())
	{
		uv_loop_close(_loop.get());
	}
}

EventLoop *uvpp::EventLoop::defaultLoop()
{
	static EventLoop defaultLoop(LoopMode::Default);
	return &defaultLoop;
}

uv_loop_t *EventLoop::raw()
{
	return _loop.get();
}

LoopStatus uvpp::EventLoop::status()
{
	return _status;
}

int EventLoop::run()
{
	if (_status == LoopStatus::StandBy)
	{
		_thread_id = uv_thread_self();
		int ret = ::uv_run(_loop.get(), UV_RUN_DEFAULT);
		if (ret == 0)
		{
			_status = LoopStatus::Running;
		}

		return ret;
	}
	return -1;
}

int EventLoop::stop()
{
	if (_status == LoopStatus::Running)
	{
		::uv_stop(_loop.get());
	}
	return 0;
}

bool EventLoop::isRunInLoopThread()
{
	if (_status == LoopStatus::Running)
	{
		return _thread_id == uv_thread_self();
	}
	return false;
}

void EventLoop::runInThisLoop()
{

}


